package com.example.demo.service.scheduled;

import com.example.demo.entity.DataSource;
import com.example.demo.mapper.DataSourceMapper;
import com.example.demo.service.NewTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 数据源同步定时任务执行器
 * 负责根据数据源配置的定时任务信息自动同步数据到任务表
 */
@Component
public class DataSourceSyncScheduler {

    @Autowired
    private DataSourceMapper dataSourceMapper;

    @Autowired
    private NewTaskService newTaskService;

    /**
     * 每分钟检查一次所有启用了定时任务的数据源
     * 并根据其cron表达式判断是否需要执行同步
     */
    @Scheduled(cron = "0 */1 * * * ?")
    @Transactional
    public void checkAndSyncDataSources() {
        //log.info("开始检查需要同步的数据源...");

        try {
            // 查询所有启用了定时任务且状态为启用的数据源
            List<DataSource> enabledSchedules = dataSourceMapper.selectByScheduleEnabledAndStatus(1, 1);
            //log.info("共找到 {} 个启用了定时任务的数据源", enabledSchedules.size());

            // 遍历每个数据源，检查是否需要同步
            for (DataSource dataSource : enabledSchedules) {
                syncDataSourceIfNeeded(dataSource);
            }
        } catch (Exception e) {
            //log.error("检查数据源定时任务失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 根据数据源配置，判断是否需要执行同步任务
     * 并在需要时调用同步方法
     */
    private void syncDataSourceIfNeeded(DataSource dataSource) {
        try {
            //log.info("开始同步数据源: {}, ID: {}", dataSource.getName(), dataSource.getId());
            
            // 调用NewTaskService中的syncTasksFromDataSource方法执行同步
            int syncedCount = newTaskService.syncTasksFromDataSource(dataSource.getId());
            
            //log.info("数据源同步完成: {}, ID: {}, 同步任务数量: {}", 
                    //dataSource.getName(), dataSource.getId(), syncedCount);
        } catch (Exception e) {
            //log.error("数据源同步失败: {}, ID: {}, 错误: {}", 
                    //dataSource.getName(), dataSource.getId(), e.getMessage(), e);
        }
    }
}